
/*************************************************************************************
 * Nombre del archivo: Archivo.java
 * Universidad del Valle de Guatemala
 * Curso: Sistemas Operativos
 * @author martin
 *          Martín Guzmán 08041
 * Fecha: Febrero de 2010
 * Descripción:
*************************************************************************************/
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Archivo {

    private String path="";
    private File archivo;
    private FileReader fr;
    private BufferedReader bf;
    private Integer Handler;
    private Integer PID_de_controlador;//contiene el PID del proceso que está utilizando este archivo
    public static int contador_handler=0;

    /***********************************************
     * Método: Archivo
     * Uso: constructor. Inicializa el buffer para la lectura
    ***********************************************/
    public Archivo(String path){
        this.path=path;
        archivo = new File(this.getPath());

        try{
            fr = new FileReader(path);
            bf = new BufferedReader(fr);
            this.escribir_io_log("File open request: "+path+" Handler assigned: "+this.Handler);
            //asigna un handler al archivo
            this.Handler=contador_handler++;
        }catch(Exception exception){
            System.out.println("error en el archivo");
        }
    }


    /***********************************************
     * Método: readLine
     * Uso: lee una línea de un archivo indicado por el path
     * @return String con la línea leída
    ***********************************************/
    public String readLine(){

        String sCadena ="";
        try{
            if ((sCadena = bf.readLine())!=null) {
                return (sCadena+"\n");
            }
        }catch(Exception exception){
            System.out.println("error en el archivo");
        }
        return null;
    }

    /***********************************************
     * Método: closeFile
     * Uso: cierra el archivo
     * @return String con la línea leída
    ***********************************************/
    public void closeFile(){
        try {
            bf.close();
            fr.close();
            this.escribir_io_log("close file request: "+path+" Handler assigned: "+this.Handler);
        } catch (Exception ex) {
            System.out.println("error al cerrar el archivo");
        }

    }

    /***********************************************
     * Método: getPath
     * Uso: retorna el path
     * @return String con el path
    ***********************************************/
    public String getPath() {
        return path;
    }

    /***********************************************
     * Método: getHandler
     * Uso: retorna el Handler
     * @return String con el Handler
    ***********************************************/
    public Integer getHandler() {
        return Handler;
    }

    /***********************************************
     * Método: getPID_de_controlador
     * Uso: retorna el PID_de_controlador
     * @return String con el PID_de_controlador
    ***********************************************/
    public Integer getPID_de_controlador() {
        return PID_de_controlador;
    }

    /***********************************************
     * Método: escribir_io_log
     * Uso: escribe el log con las peteciones de abrir y cerrar archivos
     * @param imprimir contiene lo que se desa imprimir
     * @return boolean diciendo si se guardó el archivo correctamente
    ***********************************************/
    private boolean escribir_io_log(String imprimir) {

        File TextFile = new File(Shell.path_io_log);
        FileWriter TextOut;
        try {
            TextOut = new FileWriter(TextFile, true);
            TextOut.write(imprimir+"\n");
            TextOut.close();
        } catch (IOException ex) {
            Imprimir_errores("error al guardar el log de io");
            return false;
        }
        return true;

    }
    /***********************************************
     * Método: escribir_io_log
     * Uso: escribe el log con las peteciones de abrir y cerrar archivos
     * @param imprimir contiene lo que se desa imprimir
     * @return boolean diciendo si se guardó el archivo correctamente
    ***********************************************/
    private boolean escribir_ps_log(String imprimir) {

        File TextFile = new File(Shell.path_ps_log);
        FileWriter TextOut;
        try {
            TextOut = new FileWriter(TextFile, true);
            TextOut.write(imprimir+"\n");
            TextOut.close();
        } catch (IOException ex) {
            Imprimir_errores("error al guardar el log de ps");
            return false;
        }
        return true;

    }

    /***********************************************
     * Método: Imprimir_errores
     * Uso: decide si escribir en un archivo o en la terminal
     *      dependiendo de si es síncrono o no
     * @param imprimir contiene lo que se desea imprimir
     * @return void
    ***********************************************/
    private void Imprimir_errores(String imprimir) {
        System.out.print(imprimir);
    }

}
